<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <div id="app">
        <h1>{{msg}}</h1>
        <ul>
            <li v-for="(item,index) in arr" :key="item.id">
                <input type="checkbox">
                <b>{{item.name}}</b>
            </li>
        </ul>
        <h1>{{person.nickname}}</h1>
        <h2>{{person.age}}</h2>
        <button @click="handleClick">点击添加age属性</button>
    </div>
</body>

</html>
<script src='https://cdn.jsdelivr.net/npm/vue@2.6.14/dist/vue.js'></script>
<script>
    // v-for中的key的作用:
    // vue底层的diff算法的作用,用于高效的更新页面内容
    // key的作用就是用于在diff算法的时候去表示元素的唯一性,提高diff的性能
    // key的值必须要给一个唯一的值,如果没有唯一值可以暂时使用index替代

    //vue响应式编程

    //有一些情况视图不会更新

    //1.直接操作数组的length

    //2.直接操作数组的index

    //3.直接给data中的对象添加原本不存在的属性,视图也不会响应

    //为什么?
    //vue2中,由于性能问题,Object.defineProperty不能直接劫持数组,vue采用了hack(特殊处理方式)的手段,hack了数组原型的7个方法push pop shift unshift splice reverse sort, 调用这7个方法中的其中一个,就能够让数组的数据发生变化,视图也能同步更新

    //一个千古不变的问题,vue视图如果不更新怎么办?

    //万能回答:使用vue实例.$set

    //强制更新:vue实例.$forceUpdate,慎用,开销非常大

    let vm = new Vue({
        el: "#app",
        data: {
            msg: "魔法怎么失灵啦",
            person: {
                nickname: "John",
            },
            arr: [
                {
                    id: 1,
                    name: "古丽热巴"
                },
                {
                    id: 2,
                    name: '迪丽娜扎'
                },
                {
                    id: 3,
                    name: "马尔扎哈"
                }
            ]
        },
        methods: {
            handleClick() {
                //这种写法,不会让属性变成响应式
                // this.person.age = 18
                // 语法:this.$set(target,key,value)

                this.$set(this.person, 'age', 18)
            }
        }
    })
</script>